作者:瘦瘦的胖菇凉 | 来源:互联网 | 2024-12-18 16:57
导言:本文旨在分享关于USB IP核在FPGA调试方面的经验,特别是针对Synopsys DWC3 USB IP核的调试过程,希望能为读者提供有价值的参考。
我们已经开始了Synopsys DWC3 USB IP核的调试工作,前期完成了JTAG和UART等常规调试工具的配置。目前,USB设备端的软件开发已完成,原计划是在连接PC后能够顺利进行枚举并运行。然而,实际情况并不如预期般顺利,就连获取描述符(Get Descriptor)这一基本操作的首个传输过程都无法顺利完成。
根据软件日志显示,该传输过程中首个事务(Transaction),即SETUP包的数据接收是正确的,但在第二个事务,当我们尝试发送数据时,出现了异常情况。
工欲善其事,必先利其器。为了更好地定位问题,我们决定使用USB分析仪来辅助调试。经过漫长的等待,终于收到了一台USB分析仪,但遗憾的是,这台仪器并不适用于当前的需求(它实际上是一台带有USB接口的逻辑分析仪)。于是,通过老同事的帮助,我们成功借到了合适的USB分析仪。
利用USB分析仪捕获的数据揭示了问题所在:当FPGA作为USB设备连接到PC时,我们发送的数据多出了一个额外的字节。此外,ACK包和NACK包以及IN数据包均出现了重复现象。
尽管计算机有时能识别出重复的ACK包,并继续发送后续的IN包令牌,但由于我们发送的IN数据不正确,导致整个交互过程失败。有时,计算机甚至不会发出IN包令牌(0x69)。
通过检查UTMI物理层信号线,发现TXREADY和TXVALID信号存在异常,TXREADY信号比预期多了一个周期。
回顾USB数据包格式的相关基础知识:
为了更清晰地理解USB通信过程,这里引用了一张网络上的USB数据包格式图:
此图展示了USB传输、事务和数据包之间的层次关系,具体为Transfer > Transaction > Packet。一个标准的控制传输通常包括Setup、Data和Handshake三个阶段,其中Handshake阶段的方向需与Data阶段相反。所谓的三阶段通信正是指这一点,在USB 3.0中,这种复杂的三阶段通信被简化为两阶段。每个事务可包含多个数据包,实际情况可能比图中所示更为复杂。
例如,在我们捕获的Get Descriptor传输中,Data IN事务包含了额外的9个NACK包,而在Status阶段则有更多的PING包和NACK包等。
附加:USB PID格式